package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDto;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author ：sean
 * @date ：Created in 2022/5/22
 * @description ：套餐控制器
 * @version: 1.0
 */
// http://localhost:8080/setmeal post
@Slf4j
@RestController
@RequestMapping("/setmeal")
public class SetmealController {

	@Autowired
	private SetmealService setmealService;

	@Autowired
	private CategoryService categoryService;



	// 方法名，参数及返回类型
	@GetMapping("/page")
	public R<Page> page(int page,int pageSize,String name){
		log.info("[套餐-分页列表],{},{},{}",page,pageSize,name);
		Page pageInfo = new Page(page,pageSize);
		// 通过业务对象，实现分页查询
		// 第1个page,第2条件,查询套餐信息（包含其他信息）
		LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
		setmealLambdaQueryWrapper.like(StringUtils.isNotEmpty(name),Setmeal::getName,name);
		setmealLambdaQueryWrapper.orderByDesc(Setmeal::getUpdateTime);
		setmealService.page(pageInfo, setmealLambdaQueryWrapper);
		//pageInfo (recodes,totals);
		// 如何在列表中显示分类的名称，需要改造Page返回值
		//思路： 使用SetmealDto
		Page<SetmealDto> dtoPage = new Page<>();
		//把pageInfo基本信息copy过来
		BeanUtils.copyProperties(pageInfo,dtoPage,"records");
		// 遍历records,重新转为为dto对象
		List<Setmeal> records = pageInfo.getRecords();
		List<SetmealDto> setmealDtoList= records.stream().map((item) -> {
			// 把套餐信息复制到dto里面去，有个问题，就是我们的分类名称
			SetmealDto setmealDto = new SetmealDto();
			BeanUtils.copyProperties(item, setmealDto);
			// 获取分类名称,根据分类的ID，获取分类对象
			Category category = categoryService.getById(setmealDto.getCategoryId());
			if (category != null) {
				setmealDto.setCategoryName(category.getName());
			}

			return setmealDto;
		}).collect(Collectors.toList());
		// 把dto列表赋值给page
		dtoPage.setRecords(setmealDtoList);
		return R.success(dtoPage);
	}

	// 方法ing，参数，返回值
	@PostMapping
	@CacheEvict(value = "setmeal",allEntries = true)
	public R<String> save(@RequestBody SetmealDto setmealDto){
		log.info("[套餐管理-新增],setmealDto:{}",setmealDto);
		// 现在的问题，套餐里面的菜品列表没有，所有我们怎么办
		// 现在使用业务类,保存时，需要保存套餐的基本信息，还有保存套餐菜品关系
		setmealService.saveWithDish(setmealDto);

		return R.success("新增成功");
	}

	// 三要素,前端会多个
	@CacheEvict(value = "setmeal",allEntries = true)
	@DeleteMapping
	public R<String> delete(@RequestParam List<Long> ids){
		log.info("[套餐管理-批量删除],ids:{}",ids);
		// 业务调用，想想，会不会涉及多个表
		// 删除套餐的时候，需要删除套餐对应的套餐菜品列表
		// 在套餐业务类，扩展一个业务方法
		setmealService.removeWithDish(ids);
		return R.success("删除成功");
	}

	/**
	 * 启售/停售
	 * @param status
	 * @param ids
	 * @return
	 */
	@PostMapping("/status/{status}")
	public R<String> updateStatus(@PathVariable int status,
								  @RequestParam List ids){
		log.info("[套餐管理-更新状态],status:{},ids:{}",status,ids);
		LambdaUpdateWrapper<Setmeal> updateWrapper = new LambdaUpdateWrapper<>();
		updateWrapper.set(Setmeal::getStatus,status);
		updateWrapper.in(Setmeal::getId,ids);
		setmealService.update(updateWrapper);
		return R.success("更新成功");
	}

	@GetMapping("/list")
	// setmeal::xxx_xxxx
	@Cacheable(value = "setmeal",key = "#setmeal.categoryId+'_'+#setmeal.status")
	public R<List<Setmeal>> list(Setmeal setmeal){
		LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
		queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
		queryWrapper.orderByDesc(Setmeal::getUpdateTime);

		List<Setmeal> list = setmealService.list(queryWrapper);
		return R.success(list);
	}



 }
